lib: split out RepoCheckoutFilter
authorFelix Krull <f_krull@gmx.de>
Wed, 12 Jun 2019 18:10:11 +0000 (20:10 +0200)
committerColin Walters <walters@verbum.org>
Fri, 6 May 2022 16:53:54 +0000 (12:53 -0400)
rust-bindings/rust/src/repo_checkout_at_options.rs
rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs [new file with mode: 0644]

index b69e2c30676170fab0034412526eb0afc279783e..522b16f9225b9cbfa1ac075f450ac44e923d0344 100644 (file)
@@ -1,4 +1,5 @@
-use glib::translate::{FromGlibPtrNone, Stash, ToGlib, ToGlibPtr};
+use self::repo_checkout_filter::filter_trampoline;
+use glib::translate::{Stash, ToGlib, ToGlibPtr};
 use glib_sys::gpointer;
 use libc::c_char;
 use ostree_sys::{OstreeRepo, OstreeRepoCheckoutAtOptions, OstreeRepoCheckoutFilterResult};
@@ -7,8 +8,9 @@ use {Repo, RepoCheckoutFilterResult};
 use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
 use {RepoDevInoCache, SePolicy};
 
-pub type RepoCheckoutFilter =
-    Option<Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>>;
+mod repo_checkout_filter;
+
+pub use self::repo_checkout_filter::RepoCheckoutFilter;
 
 pub struct RepoCheckoutAtOptions {
     pub mode: RepoCheckoutMode,
@@ -22,7 +24,6 @@ pub struct RepoCheckoutAtOptions {
     pub force_copy_zerosized: bool,
     pub subpath: Option<PathBuf>,
     pub devino_to_csum_cache: Option<RepoDevInoCache>,
-    // TODO: might be interesting to turn this into a type parameter
     pub filter: RepoCheckoutFilter,
     pub sepolicy: Option<SePolicy>,
     pub sepolicy_prefix: Option<String>,
@@ -51,21 +52,6 @@ impl Default for RepoCheckoutAtOptions {
 
 type StringStash<'a, T> = Stash<'a, *const c_char, Option<T>>;
 
-unsafe extern "C" fn filter_trampoline(
-    repo: *mut OstreeRepo,
-    path: *const c_char,
-    stat: *mut libc::stat,
-    user_data: gpointer,
-) -> OstreeRepoCheckoutFilterResult {
-    // TODO: handle unwinding
-    let closure =
-        user_data as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
-    let repo = FromGlibPtrNone::from_glib_none(repo);
-    let path: PathBuf = FromGlibPtrNone::from_glib_none(path);
-    let result = (*closure)(&repo, &path, &*stat);
-    result.to_glib()
-}
-
 impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOptions {
     type Storage = (
         Box<OstreeRepoCheckoutAtOptions>,
diff --git a/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs b/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs
new file mode 100644 (file)
index 0000000..ff45542
--- /dev/null
@@ -0,0 +1,24 @@
+use crate::{Repo, RepoCheckoutFilterResult};
+use glib::translate::{FromGlibPtrNone, ToGlib};
+use glib_sys::gpointer;
+use libc::c_char;
+use ostree_sys::{OstreeRepo, OstreeRepoCheckoutFilterResult};
+use std::path::{Path, PathBuf};
+
+pub type RepoCheckoutFilter =
+    Option<Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>>;
+
+pub(super) unsafe extern "C" fn filter_trampoline(
+    repo: *mut OstreeRepo,
+    path: *const c_char,
+    stat: *mut libc::stat,
+    user_data: gpointer,
+) -> OstreeRepoCheckoutFilterResult {
+    // TODO: handle unwinding
+    let closure =
+        user_data as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
+    let repo = FromGlibPtrNone::from_glib_none(repo);
+    let path: PathBuf = FromGlibPtrNone::from_glib_none(path);
+    let result = (*closure)(&repo, &path, &*stat);
+    result.to_glib()
+}